package com.huanyang.usebitmap

import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.provider.MediaStore
import android.widget.Toast
import androidx.annotation.RequiresApi
import androidx.core.content.ContextCompat

object FileOpenerUtil {

    /**
     * 打开指定Uri对应的PDF文件（支持content://和file://类型Uri）
     * @param context 上下文
     * @param pdfUri PDF文件的Uri（如content://media/external/file/238837）
     */
    fun openPdfFile(context: Context, pdfUri: Uri) {
        // 检查Uri是否有效
        if (!isUriValid(context, pdfUri)) {
            Toast.makeText(context, "文件路径无效", Toast.LENGTH_SHORT).show()
            return
        }

        // 检查文件是否存在
        if (!isFileExists(context, pdfUri)) {
            Toast.makeText(context, "文件已被删除或移动", Toast.LENGTH_SHORT).show()
            return
        }

        // 构建打开PDF的Intent
        val intent = Intent(Intent.ACTION_VIEW).apply {
            setDataAndType(pdfUri, "application/pdf")
            // 授予外部应用临时读取权限（必须添加，否则无法访问content:// Uri）
            addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
            // 避免启动当前应用（如果当前应用也支持打开PDF）
            addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)
            addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        }

        // 检查是否有应用可处理该Intent
        if (intent.resolveActivity(context.packageManager) != null) {
            ContextCompat.startActivity(context, intent, null)
        } else {
            Toast.makeText(context, "未找到可打开PDF的应用（如WPS、Adobe Acrobat）", Toast.LENGTH_SHORT).show()
        }
    }

    fun openWordFile(context: Context, wordUri: Uri) {
        // 1. 检查Uri是否有效（复用之前的工具方法）
        if (!isUriValid(context, wordUri)) {
            Toast.makeText(context, "Word文件路径无效", Toast.LENGTH_SHORT).show()
            return
        }

        // 2. 检查文件是否存在（复用之前的工具方法）
        if (!isFileExists(context, wordUri)) {
            Toast.makeText(context, "Word文件已被删除或移动", Toast.LENGTH_SHORT).show()
            return
        }

        // 3. 构建打开Word的Intent（关键：设置.docx的MIME类型）
        val intent = Intent(Intent.ACTION_VIEW).apply {
            // .docx的标准MIME类型
            setDataAndType(wordUri, "application/vnd.openxmlformats-officedocument.wordprocessingml.document")
            // 授予外部应用临时读取权限（必须，否则无法访问content:// Uri）
            addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
            // 避免启动当前应用（若当前应用也支持打开Word）
            addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)
            // 确保在新任务中启动（适配多任务场景）
            addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        }

        // 4. 检查是否有应用可处理该Intent
        if (intent.resolveActivity(context.packageManager) != null) {
            ContextCompat.startActivity(context, intent, null)
        } else {
            Toast.makeText(context, "未找到可打开Word的应用（如WPS、Microsoft Word）", Toast.LENGTH_SHORT).show()
        }
    }

    /**
     * 跳转到文件所在的文件夹（如下载目录）
     * @param context 上下文
     * @param fileUri 文件的Uri（如content://media/external/file/238837）
     */
    @RequiresApi(Build.VERSION_CODES.Q)
    fun openFileLocation(context: Context, fileUri: Uri) {
        // 检查Uri有效性
        if (!isUriValid(context, fileUri)) {
            Toast.makeText(context, "文件路径无效", Toast.LENGTH_SHORT).show()
            return
        }

        // 构建跳转到文件管理器的Intent
        val intent = Intent(Intent.ACTION_VIEW).apply {
            // 尝试直接定位到文件所在目录（部分文件管理器支持）
            setDataAndType(fileUri, "resource/folder")
            addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
            addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        }

        // 兼容性处理：如果文件管理器不支持"resource/folder"，则跳转到下载目录
        if (intent.resolveActivity(context.packageManager) == null) {
            // 跳转到系统下载目录（通用方案）
            val downloadsUri = MediaStore.Downloads.EXTERNAL_CONTENT_URI
            intent.setDataAndType(downloadsUri, "resource/folder")
        }

        // 启动文件管理器
        if (intent.resolveActivity(context.packageManager) != null) {
            ContextCompat.startActivity(context, intent, null)
        } else {
            Toast.makeText(context, "未找到文件管理器应用", Toast.LENGTH_SHORT).show()
        }
    }

    /**
     * 检查Uri是否有效（避免空Uri或格式错误）
     */
    private fun isUriValid(context: Context, uri: Uri?): Boolean {
        return uri != null && try {
            // 尝试解析Uri的Scheme（content://或file://）
            uri.scheme != null && (uri.scheme == "content" || uri.scheme == "file")
        } catch (e: Exception) {
            false
        }
    }

    /**
     * 检查Uri对应的文件是否存在（避免文件被删除后Uri失效）
     */
    private fun isFileExists(context: Context, uri: Uri): Boolean {
        return try {
            // 通过ContentResolver查询文件是否存在
            context.contentResolver.query(
                uri,
                arrayOf(MediaStore.Files.FileColumns._ID), // 只查询ID，减少开销
                null,
                null,
                null
            )?.use { cursor ->
                cursor.count > 0 // 游标有数据则表示文件存在
            } ?: false
        } catch (e: Exception) {
            false // 发生异常（如权限不足）视为文件不存在
        }
    }
}